//
//  WBStatusViewModel.swift
//  GitWeibo
//
//  Created by 胡金东 on 2017/6/6.
//  Copyright © 2017年 胡金东. All rights reserved.
//

import Foundation

/**
 如果没有任何父类，如果希望在开发时调试，输出调试信息，需要
 1. 遵守 CustomStringConvertible
 2. 实现 description 计算型属性
 */
/**
关于表格的性能优化
    
    - 尽量少计算，所有需要的素材提前计算好！
    - 控件上不要设置圆角半径，所有图像渲染的属性，都要注意！
    - 不要动态创建控件，所有需要的控件，都要提前创建好，在显示的时候，根据数据隐藏／显示！
    - Cell 中控件的层次越少越好，数量越少越好！
        - 要测量，不要猜测！
*/

/// - 单条微博的视图模型
class WBStatusViewModel : CustomStringConvertible {
    
    /// - 微博模型
    var status: WBStatusModel
    
    /// - 会员图标 - 存储型属性
    var memberIcon : UIImage?
    /// - 认证类型 -1 表示没有认证  0 表示认证  2，3，5企业认证  220 达人
    var vipIcon : UIImage?
    /// - 转发文字
    var retweetedStr:String?
    /// - 评论文字
    var commentStr:String?
    /// - 点赞文字
    var likeStr : String?
    /// - 配图size
    var pictureSize = CGSize()
    
    /// - 如果是转发微博，原创微博一定没有图，计算图片数量
    var picURLs : [WBPictureModel]? {
        /// - 如果有被转发的微博，返回被转发微博的配图 status.retweeted_status?.pic_urls
        /// - 如果没有被转发的微博，返回原创微博的配图 status.pic_urls
        /// - 如果都没有就返回nil
    return status.retweeted_status?.pic_urls ?? status.pic_urls
    }
    
    /// - 转发微博文字
    var retweetedText : String?
    
    /// - 设置行高
    var rowHeight: CGFloat = 0
    
    
    
    /// 构造函数
    /// - Parameter model: 微博模型
    /// - returns: 微博的视图模型
    init(model:WBStatusModel) {
        
        self.status = model
        
        /// - 直接计算出会员图标/会员等级
        if (model.user?.mbrank)! > 0  && (model.user?.mbrank)! < 7 {
            let imageName = "common_icon_membership_level\(model.user?.mbrank ?? 1)"
            memberIcon = UIImage(named:imageName)
        }
        switch model.user?.verified_type ?? -1 {
        case 0:
            vipIcon = UIImage(named: "avatar_vip")
        case 2,3,5 :
            vipIcon = UIImage(named: "avatar_enterprise_vip")
        case 220:
            vipIcon = UIImage(named: "avatar_grassroot")
        default:
            break
        }
        
        /// - 测试数据 10000以上
//        model.reposts_count = Int(arc4random_uniform(10000))
        
        retweetedStr = countString(count: model.reposts_count, defaultStr: "转发")
        commentStr = countString(count: model.comments_count, defaultStr: "评论")
        likeStr = countString(count: model.attitudes_count, defaultStr: "赞")
        
        /// - 计算配图大小 （有原创就计算原创的 有转发就计算转发的）
        pictureSize = calcPictureViewSize(count: picURLs?.count)
        
        /// - 设置被转发微博的文字
        retweetedText = "@"
            + (status.retweeted_status?.user?.screen_name ?? "")//取出被转发的名字
            + ":"
            + (status.retweeted_status?.text ?? "") //取出转发的正文
      
        ///更新行高
        updateRowHeight()
    }
    
    var description: String {
        return status.description
    }
    
    func updateRowHeight()  {
        // 原创微博：顶部分隔视图(12) + 间距(12) + 图像的高度(34) + 间距(12) + 正文高度(需要计算) + 配图视图高度(计算) + 间距(12) ＋ 底部视图高度(35)
        // 被转发微博：顶部分隔视图(12) + 间距(12) + 图像的高度(34) + 间距(12) + 正文高度(需要计算) + 间距(12)+间距(12)+转发文本高度(需要计算) + 配图视图高度(计算) + 间距(12) ＋ 底部视图高度(35)
        let margin: CGFloat = 12
        let iconHeight:CGFloat = 34
        let toolbarHeight:CGFloat = 35
        
        var height : CGFloat = 0
        
        let viewSize = CGSize(width: UIScreen.cz_screenWidth() - 2 * margin, height: CGFloat(MAXFLOAT))
        let originalFont = UIFont.systemFont(ofSize: 15)
        let retweetedFont = UIFont.systemFont(ofSize: 14)
        
        /// - 1.计算顶部的高度
        height = 2 * margin + iconHeight + margin
        
        /// - 2. 正文高度
        if let text = status.text {
            /**
             1.预期尺寸，宽度固定，高度尽量大
             2.选项，换行文本，统一使用 usesLineFragmentOrigin
             3.attributes：指定字体字典
             */
            height += (text as NSString).boundingRect(with: viewSize, options:[.usesLineFragmentOrigin], attributes: [NSFontAttributeName:originalFont], context: nil).height
        }
        /// - 3.判断是否转发微博
        if status.retweeted_status != nil {
            /// - 间距
            height += 2 * margin
            /// - 转发微博文本的高度，一定用retweetedText,拼接了 @用户名：微博文字
            if let text = retweetedText {
                
                height += (text as NSString).boundingRect(with: viewSize, options: [.usesLineFragmentOrigin], attributes: [NSFontAttributeName:retweetedFont], context: nil).height
            
            }
            
        }
       /// - 4.配图视图
        height += pictureSize.height + margin
       /// - 底部工具栏
        height += toolbarHeight
       /// - 6.使用属性记录
        rowHeight = height

    }
    
    
    /// - 更新单图尺寸
    func updateSingImageSize(image:UIImage)  {
        var size = image.size
        
        let maxWidth:CGFloat = 300
        let minWidth:CGFloat = 40
        /// - 图像过宽处理
        if size.width > maxWidth {
            size.width = maxWidth
            size.height = size.width * image.size.height / image.size.width
        }
        
        /// - 图像过窄处理
        if size.width < minWidth {
            size.width = minWidth
            /// - 长微博 太长时，高度会太高，影响体验 所以要除以4
            size.height = size.width * image.size.height / image.size.width / 4
        }
        
        /// - 重新设置配图视图大小
        pictureSize = size
        ///更新行高
        updateRowHeight()
        
    }
    
    func countString(count: Int,defaultStr:String) -> String {
        if count == 0 {
            return defaultStr
        }
        if count <= 10000 {
            return count.description
        }
        
        return String(format: "%.02f万",Double(count)/10000)
    }
    
    func calcPictureViewSize(count: Int?) -> CGSize {
        if count == 0  || count == nil{
            return CGSize()
        }
        
              /// - 行数
        // 1> 根据 count 知道行数 1 ~ 9
        /**
         1 2 3 = 0 1 2 / 3 = 0 + 1 = 1
         4 5 6 = 3 4 5 / 3 = 1 + 1 = 2
         7 8 9 = 6 7 8 / 3 = 2 + 1 = 3
         */

        let row = (CGFloat) ((count! - 1)/3 + 1)
        
        /// - 根据行数算高度
        let height = row * WBStatusEveryOnePictureWidth + (row - 1) * WBStatusPictureViewInnerMargin
        return CGSize(width: WBStatusPictureWidth, height: height)
        
        
    }
    
}
